iT邦幫忙

2022 iThome 鐵人賽

DAY 19
0
Modern Web

Fastify 101系列 第 19

[Fastify] Day19 - Database

  • 分享至 

  • xImage
  •  

大家好,我是 Yubin

這篇文章會介紹 Fastify 生態系中對 Database 的支援,以及透過 Docker 啟動一個 MongoDB Container 來實際玩玩看。


Fastify 官方維護了許多關於資料庫的 Plugin:

除了官方維護的套件外,還有社群提供的許多跟資料庫進行互動的 Plugin。

本篇以 MongoDB 為例。


MongoDB

MongoDB 是一個文件式 (document) 的資料庫。

不用像關聯式資料庫一樣需要先定義好 Tabke Schema,直接把資料放進去就可以使用。

一筆"文件",可能會看起來像這樣:

{
  name: "Yubin",
  email: "yubin.taiwan@gmail.com"
}

沒錯,看起來就像個 JSON 格式的字串,MongoDB 對 JavaScript 非常友善。

我們可以直接把某個 JavaScript 的物件,直接存放進 MongoDB 中,可以想像成是把某個物件當時的狀態,直接快照 (snapshot) 進資料庫。


MongoDB Container

我們要如何開發與 MongoDB 互動的程式呢?

一個方式是去 MongoDB 的官網,根據所使用的作業系統,下載 MongoDB Server 的安裝檔或執行檔,然後啟動 MongoDB 的伺服器。

但更快且更建議的做法是,使用 Container。

如果你安經安裝了 Docker 或 Podman,就可以在 terminal 下指令,把 MongoDB Container 跑起來。

docker run -d -p 27017:27017 --name=mongo-server mongo

執行完後,再執行:

docker ps

如果有看到 mongo-server 正在執行中,就代表啟動成功。

https://ithelp.ithome.com.tw/upload/images/20221004/20151148DaAaSg13Rz.jpg

如果使用的是 podman,
docker run 改為 podman run,以及 docker ps 改為 podman ps 即可。

MongoDB Compass

我們起好 MongoDB Container 之後,可以下載官方的 MongoDB Compass

MongoDB Compass 是一個視覺化的 MongoDB Client 工具,可以幫助你瀏覽某一座 MongoDB Server 上的資料,以及可以透過圖形化的介面去新增、修改、刪除上面的紀錄。

安裝好之後開啟程式。

https://ithelp.ithome.com.tw/upload/images/20221004/20151148RNZMmLgNzj.jpg

會看到要求輸入 Connection 的提示。

MongoDB Connection String

Connection String,連線字串,這個字串記錄了要連的 MongoDB Server 的資訊,以及登入的帳號密碼或資料庫。

官方描述的 Connection String 規格如下:

mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]

開頭必定要是 mongodb://

然後如果登入該資料庫需要帳號密碼,可以用 : 串起來。
例如,user01:password01

如果有輸入帳號密碼的話,加上 @ 串上主機名稱。

:port,MongoDB Server 愈設的 Port 是 27017

/defaultauthdb 預設使用的資料庫,沒有設定的話會使用該登入帳號預設的資料庫。


因為我們利用 Docker 將 MongoDB Container 起在本機 (localhost),該 image 也沒有預設的帳號密碼,
所以我們使用的 Connection String 是:

mongodb://localhost:27017

輸入這個 Connection String 就可以透過 MongoDB Compass 登入 MongoDB Server。

https://ithelp.ithome.com.tw/upload/images/20221004/20151148hT6AXxnN7C.jpg

是的,一開始沒有資料,只有 MongoDB 預設的幾個 Collection。

@fastify/mongodb

@fastify/mongodb 是官方維護的 MongoDB Plugin。

透過 npm 安裝:

npm i @fastify/mongodb

接著在程式中 import 套件,並註冊他。

import fastifyMongodb from '@fastify/mongodb'

server.register(fastifyMongodb, {
    forceClose: true,
    url: 'mongodb://localhost:27017/my-fastify'
})

forceClose 參數表示在應用程式結束的時候,也把 MongoDB 的連線關閉,
預設為 false

url 帶入 MongoDB 的 Connection String。(這邊使用 my-fastify 資料庫)

就完成註冊的工作了。

@fastify/mongodb 會註冊一個 MongoDB Client 的 decorator 在 FastifyInstance。


我們定義一個 Post /users 的 route 來搭配將資料寫進 MongoDB:

interface UserRequestBody {
    name: string
    email: string
}

server.post<{ Body: UserRequestBody }>('/users', async (request, reply) => {
    const name = request.body.name
    const email = request.body.email
    try {
        const users = server.mongo.db?.collection('users')

        const user = await users?.insertOne({
            name: name,
            email: email
        })

        return reply.status(201).send({ user })
    } catch (error) {
        return reply.status(500).send({ error })
    }
})

定義 reuqest.body 會拿到 name 跟 email 的欄位,且型態都是字串。

透過 server.mongo.db 拿到 MongoDB Client 物件,取得 collection 後,透過 .insertOne() 來插入資料。

接著透過 Postman 等 API Client 工具,發送 POST Request。

Payload 帶入 name 及 email 的值。

https://ithelp.ithome.com.tw/upload/images/20221004/20151148iBujvAkWCE.jpg

發送後可以看到 201 Created 的回應,表示成功沒有問題。

接著打開 MongoDB Compass,可以觀察到資料確實被寫進資料庫中。

https://ithelp.ithome.com.tw/upload/images/20221004/20151148zg9LLDcOFa.jpg

自此對於資料庫的串接實驗就完成了。


Fastify 的官網中還有許多對於不同 Database 的範例,有興趣的人可以去尋找適合的 Plugin 來使用。


上一篇
[Fastify] Day18 - Testing
下一篇
[Fastify] Day20 - Mongoose
系列文
Fastify 10130
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言